package org.abc.fund.controller.funds;

import org.abc.fund.dto.FundBasicInfoDTO;
import org.abc.fund.entity.funds.FundBasicInfo;
import org.abc.fund.service.funds.FundService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/fund")
public class FundController {

    @Autowired
    private FundService fundService;

    // ✅ 获取全部基金（返回 DTO 列表）
    @GetMapping("/all")
    public List<FundBasicInfoDTO> getAllFunds() {
        return fundService.getAllFunds().stream().map(this::toDTO).toList();
    }

    // ✅ 获取某个基金（返回实体，如需前端展示可改为 DTO）
    @GetMapping("/{code}")
    public FundBasicInfo getFundByCode(@PathVariable String code) {
        return fundService.getFundByCode(code);
    }

    // ✅ 新增基金
    @PostMapping("/add")
    public FundBasicInfo addFund(@RequestBody FundBasicInfo fund) {
        return fundService.addFund(fund);
    }

    // ✅ 更新基金
    @PutMapping("/update/{code}")
    public FundBasicInfo updateFund(@PathVariable String code, @RequestBody FundBasicInfo updatedFund) {
        return fundService.updateFund(code, updatedFund);
    }

    // ✅ 删除基金
    @DeleteMapping("/delete/{code}")
    public void deleteFund(@PathVariable String code) {
        fundService.deleteFund(code);
    }

    // ✅ 标签筛选（返回 DTO 列表）
    @GetMapping("/by-tag")
    public List<FundBasicInfoDTO> getFundsByTag(@RequestParam String tagName) {
        return fundService.getFundsByTag(tagName).stream().map(this::toDTO).toList();
    }

    // ✅ 基金列表页分页 + 筛选（关键词 + 标签）
    @GetMapping("/page")
    public Page<FundBasicInfoDTO> getPagedFunds(
            @RequestParam(defaultValue = "0") int page,
            @RequestParam(defaultValue = "10") int size,
            @RequestParam(required = false) String keyword,
            @RequestParam(required = false) List<String> tagNames
    ) {
        return fundService.getPagedFunds(page, size, keyword, tagNames);
    }

    // ✅ 基金经理页分页查询
    @GetMapping("/page-by-manager")
    public Page<FundBasicInfoDTO> getFundsByManagerPaged(
            @RequestParam String managerName,
            @RequestParam(defaultValue = "0") int page,
            @RequestParam(defaultValue = "10") int size
    ) {
        return fundService.getFundsByManagerPaged(managerName, page, size);
    }

    // ✅ 基金公司页分页查询
    @GetMapping("/page-by-company")
    public Page<FundBasicInfoDTO> getFundsByCompanyPaged(
            @RequestParam String companyName,
            @RequestParam(defaultValue = "0") int page,
            @RequestParam(defaultValue = "10") int size
    ) {
        return fundService.getFundsByCompanyPaged(companyName, page, size);
    }

    // ✅ 模糊搜索基金公司
    @GetMapping("/search-by-company")
    public List<FundBasicInfoDTO> searchByCompany(@RequestParam String keyword) {
        return fundService.searchByCompanyNameLike(keyword);
    }

    // ✅ 模糊搜索基金经理
    @GetMapping("/search-by-manager")
    public List<FundBasicInfoDTO> searchByManager(@RequestParam String keyword) {
        return fundService.searchByManagerNameLike(keyword);
    }

    // ✅ DTO 转换方法（仅供内部使用）
    private FundBasicInfoDTO toDTO(FundBasicInfo fund) {
        return new FundBasicInfoDTO(
                fund.getCode(),
                fund.getName(),
                fund.getType(),
                fund.getStatus(),
                fund.getLatestNav(),
                fund.getLatestNavDate(),
                fund.getLatestEstNav(),
                fund.getLatestEstRate(),
                fund.getManager() != null ? fund.getManager().getName() : null,
                fund.getCompany() != null ? fund.getCompany().getName() : null
        );
    }
}
